/*
 * uarts.c
 *
 *  Created on: Jan 31, 2024
 *      Author: TT
 */

#include "uarts.h"

/*
 函数功能：串口1DMA数据发送
 函数形参：Sendbuff ：缓冲数据
 Bufflens ：数据长度
 函数返回值：数据长度
 备注：无
 */
uint16_t Uart1_DMA_Sent(uint8_t *Sendbuff, uint16_t Bufflens) {
	uint16_t l_val = Bufflens > UART_BUFFSIZE ? UART_BUFFSIZE : Bufflens;
	if (Bufflens <= 0) {
		return 0;
	}
	while (__HAL_DMA_GET_COUNTER(&hdma_usart1_tx));
	//检测DMA发送通道内还有没有数据
	if (Sendbuff) {
		memcpy(Uart1_Str.Uart_SentBuff, Sendbuff, l_val);
	}
	HAL_UART_Transmit_DMA(&huart1, Uart1_Str.Uart_SentBuff, l_val);
	return l_val;
}

/*
 *函数功能：串口1接收中断函数
 */
void USART1_IRQHandler(void) {
	// 以下一堆问题，未能解决，明天到公司弄。

	if (__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE) != RESET) {
		__HAL_UART_CLEAR_IDLEFLAG(&huart1);
		uint16_t l_val;
		Uart1_Str.Uart_RecvLens = UART_BUFFSIZE - __HAL_DMA_GET_COUNTER(&hdma_usart1_rx); // 通过DMA接收指针计算接收的字节数
		if (l_val > Uart1_Str.RecvQue_Tail) {
			Uart1_Str.Uart_RecvLens += l_val - Uart1_Str.RecvQue_Tail;
		} else {
			Uart1_Str.Uart_RecvLens += UART_BUFFSIZE - Uart1_Str.RecvQue_Tail
					+ l_val;
		}
		Uart1_Str.RecvQue_Tail = l_val;
		Uart1_Str.Uart_RecvLens %= UART_BUFFSIZE;
		__HAL_UART_CLEAR_IDLEFLAG(&huart1);
	}
	HAL_UART_IRQHandler(&huart1); // 这一条保留就行了
}

/*
 函数功能：接收数据函数
 函数形参：* Uart_Str ： 串口数据缓冲结构地址
 RcvBuff ：接收数据缓冲区
 RevLen  ：接收缓冲区长度
 函数返回值：接收数据长度
 备注：无
 */
static uint16_t Uart_Receive_Data(UART_STR *Uart_Str, uint8_t *RcvBuff,
		uint16_t RevLen) {
	uint16_t l_val = 0;            // 局部变量   此次能拷贝的数据个数
	if (!RevLen || !Uart_Str->Uart_RecvLens) {
		return 0;
	}
	l_val = Uart_Str->Uart_RecvLens;

	if (l_val > RevLen)  // 缓冲区的数据数量比传进来的缓冲区容量大
			{
		l_val = RevLen;
	}
	if (Uart_Str->RecvQue_Tail > Uart_Str->RecvQue_Head) {
		memcpy(RcvBuff, Uart_Str->Uart_RecvBuff + Uart_Str->RecvQue_Head,
				l_val);
	} else {
		if ((UART_BUFFSIZE - Uart_Str->RecvQue_Head) >= l_val) {
			memcpy(RcvBuff, Uart_Str->Uart_RecvBuff + Uart_Str->RecvQue_Head,
					l_val);
		} else {
			memcpy(RcvBuff, Uart_Str->Uart_RecvBuff + Uart_Str->RecvQue_Head,
			UART_BUFFSIZE - Uart_Str->RecvQue_Head);
			memcpy(RcvBuff + (UART_BUFFSIZE - Uart_Str->RecvQue_Head),
					Uart_Str->Uart_RecvBuff,
					l_val - (UART_BUFFSIZE - Uart_Str->RecvQue_Head));
		}
	}
	Uart_Str->Uart_RecvLens -= l_val;
	Uart_Str->RecvQue_Head += l_val;
	Uart_Str->RecvQue_Head %= UART_BUFFSIZE;
	return l_val;
}
/*
 函数功能：从串口获取数据
 函数形参：* Uartx ：串口地址
 RcvBuff ：接收缓冲指针
 RevLen  ：接收缓冲区大小
 函数返回值：接收数据长度
 备注：无
 */
uint16_t Get_Uart_Data(USART_TypeDef *Uartx, uint8_t *RcvBuff, uint16_t RevLen) {
	if (Uartx == USART1) {
		return (Uart_Receive_Data(&Uart1_Str, RcvBuff, RevLen));
	}
//	else if (Uartx == USART2) {
//		return (Uart_Receive_Data(&Uart2_Str, RcvBuff, RevLen));
//	} else if (Uartx == USART3) {
//		return (Uart_Receive_Data(&Uart3_Str, RcvBuff, RevLen));
//	} else if (Uartx == UART4) {
//		return (Uart_Receive_Data(&Uart4_Str, RcvBuff, RevLen));
//	} else if (Uartx == UART5) {
//		return (Uart_Receive_Data(&Uart5_Str, RcvBuff, RevLen));
//	}
	return 0;
}

